package com.sky.utils;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriUtils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * @Description: 百度地图工具类
 * @Author: Zonghe Wang
 * @Date: 2025/1/26 10:12
 */
@Component
public class BaiDuUtil {

    @Value("${sky.baidu.AK}")
    private String AK;

    @Value("${sky.baidu.location-url}")
    private String LOCATION_URL;

    @Value("${sky.baidu.distance-url}")
    private String DISTANCE_URL;

    /**
     * 默认ak
     * 选择了ak，使用IP白名单校验：
     * 根据您选择的AK已为您生成调用代码
     * 检测到您当前的ak设置了IP白名单校验
     * 您的IP白名单中的IP非公网IP，请设置为公网IP，否则将请求失败
     * 请在IP地址为0.0.0.0/0 外网IP的计算发起请求，否则将请求失败
     */
    public String requestGetLocation(String address) throws Exception {

        StringBuffer queryString = new StringBuffer();
        queryString.append(LOCATION_URL);
        queryString.append("address=" + UriUtils.encode(address, "UTF-8") + "&");

        queryString.append("output=json&");
        queryString.append("ak=" + AK + "&");
        queryString.append("callback=showLocation&");

        /*
        StringBuffer queryString = new StringBuffer();
        queryString.append(strUrl);
        for (Map.Entry<?, ?> pair : param.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }
        */

        // 去除最后一个&
        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }

        java.net.URL url = new URL(queryString.toString());
        URLConnection httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.connect();

        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        StringBuffer buffer = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
        isr.close();
        String lng = buffer.substring(buffer.indexOf("lng") + 5, buffer.indexOf("lng") + 5 + 10);
        String lat = buffer.substring(buffer.indexOf("lat") + 5, buffer.indexOf("lat") + 5 + 9);
        return lat+","+lng;
    }

    /**
     * 默认ak
     * 选择了ak，使用IP白名单校验：
     * 根据您选择的AK已为您生成调用代码
     * 检测到您当前的ak设置了IP白名单校验
     * 您的IP白名单中的IP非公网IP，请设置为公网IP，否则将请求失败
     * 请在IP地址为0.0.0.0/0 外网IP的计算发起请求，否则将请求失败
     */
    public String requestGetDistance(String origin, String destination) throws Exception {

        StringBuffer queryString = new StringBuffer();
        queryString.append(DISTANCE_URL);
        queryString.append("origin="+origin+"&");
        queryString.append("destination="+destination+"&");
        queryString.append("ak=" + AK + "&");

        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }

        java.net.URL url = new URL(queryString.toString());
        System.out.println(queryString.toString());
        URLConnection httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.connect();

        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        StringBuffer buffer = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
        isr.close();
        System.out.println(buffer);
        String distance = buffer.substring(buffer.indexOf("distance") + 10, buffer.indexOf(",\"duration"));
        return distance;
    }

}
